package py.com.fms.gnd.session.maintenances;

//External classes imports 
//Java Classes
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;

//Seam Classes
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.log.Log;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.international.StatusMessage.Severity;
import org.jboss.seam.security.Credentials;
import org.jboss.seam.security.Identity;

//project classes imports

import py.com.fms.fms.bean.UsersBean;
import py.com.fms.fms.persistence.services.UsersServices;
import py.com.fms.gnd.bean.RacesBean;
import py.com.fms.gnd.bean.TreatmentBean;
import py.com.fms.gnd.bean.TreatmentBean;
import py.com.fms.gnd.persistence.services.RacesServices;
import py.com.fms.gnd.persistence.services.TreatmentServices;
import py.com.fms.gnd.persistence.services.TreatmentServices;
import py.com.fms.converter.TreatmentConverter;
import py.com.fms.exception.CommonException;
import py.com.fms.session.ServiceSqlMap;
import py.com.fms.session.WithinHolder;
import py.com.fms.utilities.ConvertAssistant;
import py.com.fms.utilities.DateAssistant;

@SuppressWarnings("unused")
@Name("editTreatment")
@Scope(ScopeType.SESSION)
public class EditTreatment {
	
	private FacesMessages facesMessages;
	@Logger
	private Log log;
	@In("#{serviceSqlMap}")
	private ServiceSqlMap sqlMap;
	private boolean editMode;
	private String initVar;
	private Date today = null;

	// Task Attendees Attributes 
	@In("#{withinHolder}")
	private WithinHolder aid;
	@In("#{convertAssist}")
	private ConvertAssistant convert;
	@In Credentials credentials;
	@In Identity identity;
	private DateAssistant dateAssist;
	
	
	// Beans
	private UsersBean user = null; // For User Data 
	private TreatmentBean treatment = null; // Used in main forms
	private TreatmentBean editTreatment = null; // Used for update operations
	
	// Services
	private UsersServices usSrv;
	private TreatmentServices trSrv;
	
	// Collections
	private Collection<TreatmentBean> allTreatment; // Used to store all object data
    
	
	/**
	 * [[[[[[[[[[[[ Methods ]]]]]]]]]]]] 
	 * [[[[[[[[[[-------------]]]]]]]]]]
	 */

	
	// Used to initialize Objects
	public void initData() throws CommonException {

		System.out.println("Initialization Flag = " + this.getInitVar());

		if ("S".equals(this.getInitVar())) { // Checking initialization Flag
			this.initBeans(); // Initializing Beans
			this.initServices(); // Initializing Services
			this.initAssistants(); // Initializing Assistants
			this.initCollections(); // Initializing Collections
			this.loadDataGrid(); // Loading data for grid
			this.loadUserData(); // Retrieving User Data
			
		}
		this.setInitVar(null);
		System.out.println("OUT");
				
	}
	
	   private void initBeans(){
	    	
		  	if(user == null){
		  		user = new UsersBean();
		  	}
		  	
		  	if(treatment == null){
		  		treatment = new TreatmentBean();
		  	}
		  	
		  	if(editTreatment == null){
		  		editTreatment = new TreatmentBean();
		  	}
		
	    }
	    
	    private void initServices() throws CommonException{
	    	
	    	if (trSrv == null){
				trSrv = new TreatmentServices(this.sqlMap.getConfig());
			}
			
			if (usSrv == null){
				usSrv = new UsersServices(this.sqlMap.getConfig());
			}
	    	
	    }
	    
	    private void initAssistants(){
	    	
	    	if(aid == null){
	    		aid = new WithinHolder();
	    	}
	    	
	    	if(convert == null){
				convert = new ConvertAssistant();
			}
	    	
	    }
	    
	    private void initCollections(){
	    	
	    	if(allTreatment == null){
	    		allTreatment = new ArrayList<TreatmentBean>();
	    	}
	    }

	 
	    // Used to clean all objects
	    public void cleanData() throws CommonException{
	    	
	    	// Cleaning Beans
	  		user = null;
	  		treatment = null;
	  		editTreatment = null;

	  		// Cleaning Services
			trSrv = null;
			usSrv = null;

			// Cleaning Assistants
			aid = null;
			convert = null;
			dateAssist = null;
			
			// Cleaning Collections
			allTreatment = null;
	    	
	    }
	  
	// Used to load a grid using a collection
	private void loadDataGrid() {
		try {
			this.setAllTreatment(trSrv.getAllTreatments());
			for (TreatmentBean treatment : this.getAllTreatment()) {
				System.out.println(treatment.getCod() + " - " + treatment.getDescrip());
			}
		} catch (CommonException e) {
			e.printStackTrace();
		}
	}

	
    private void loadUserData() throws CommonException{
    	
    	if(credentials != null){ // Checking if credentials are null
			System.out.println("Credenciales Encontradas");
			
			this.getUser().setUserName(credentials.getUsername()); // Retrieving user name
			System.out.println("User Name: " + this.getUser().getUserName());
			
			user = usSrv.getUserDataByName(this.getUser().getUserName()); // Retrieving user Data
			this.setUser(user);
			System.out.println("User: " + this.getUser());
			
		}else{	
			System.out.println("Credenciales Nulas");
		}
    }
    
	// Used to cancel
	public String cancelData() {
//		this.facesMessages.clear();
		this.setInitVar("S");
		return null;
	}
		

	// Used for data saving process
	public void saveNewData() throws ParseException, CommonException {
		try {
			this.facesMessages.clear();
			TreatmentBean newTreatment = new TreatmentBean();
			this.today = DateAssistant.getCurrentDate();

			if (this.getTreatment() == null) {
				System.out.println("this.getAnimalType() == null");
				throw new CommonException("error.fms.menu.error.countrynotexist");
			}
			System.out.println("Before setNewCurrency");
			// Setting field values
			newTreatment.setCod(this.convert.convertField(this.getTreatment().getCod()));
			newTreatment.setDescrip(this.convert.convertField(this.getTreatment().getDescrip()));
			newTreatment.setStatus(this.convert.convertField(this.getTreatment().getStatus()));
			newTreatment.setStartDate(this.today);
			System.out.println(this.today);
			newTreatment.setUserIns(user.getId());
			
			trSrv.saveNewTreatment(newTreatment);
			
		} catch (CommonException e) {
//			this.facesMessages.add(Severity.ERROR, e.getMessage());
			System.out.println("NO SE PUDO INSERTAR. " + e.getMessage());
			log.error(e);
		}finally{
			this.cleanData(); // Cleaning Objects
			this.setInitVar("S"); // Setting initialization Flag
		}
	}
	
	// Retrieving data for updating
	public void dataToEdit(Long id){
		System.out.println("id = " + id.toString());
		for (TreatmentBean bean : this.getAllTreatment()) {
			if(bean.getId() == id){
				this.setEditTreatment(bean);
				return;
			}			
		}	
	}
	
	public void dataToEditUpd() throws ParseException{
		try {
			trSrv.updateTreatment(this.getEditTreatment());
		} catch (CommonException e) {
//			this.facesMessages.add(Severity.ERROR, e.getMessage());
			System.out.println("NO SE PUDO ACTUALIZAR EL REG. " + e.getMessage());
			log.error(e);
		}
	}
	
	public void dataToDelete(Long id){
		for (TreatmentBean bean: this.getAllTreatment()){
			if (bean.getId() == id) {
				try {
					trSrv.deleteTreatmentById(bean.getId());
					
				} catch (Exception e) {
//					this.facesMessages.add(Severity.ERROR, e.getMessage());
					System.out.println("NO SE BORRAR EL REGISTRO. " + e.getMessage());
					log.error(e);
				}
			}
			
		}
		this.setInitVar("S");
	}
	

//	GETTERS AND SETTERS
	
	public FacesMessages getFacesMessages() {
		return facesMessages;
	}

	public void setFacesMessages(FacesMessages facesMessages) {
		this.facesMessages = facesMessages;
	}

	public Log getLog() {
		return log;
	}

	public void setLog(Log log) {
		this.log = log;
	}

	public ServiceSqlMap getSqlMap() {
		return sqlMap;
	}

	public void setSqlMap(ServiceSqlMap sqlMap) {
		this.sqlMap = sqlMap;
	}

	public boolean isEditMode() {
		return editMode;
	}

	public void setEditMode(boolean editMode) {
		this.editMode = editMode;
	}

	public String getInitVar() {
		return initVar;
	}

	public void setInitVar(String initVar) {
		this.initVar = initVar;
	}

	public TreatmentBean getTreatment() {
		return treatment;
	}

	public void setTreatment(TreatmentBean treatment) {
		this.treatment = treatment;
	}

	public TreatmentBean getEditTreatment() {
		return editTreatment;
	}

	public void setEditTreatment(TreatmentBean editTreatment) {
		this.editTreatment = editTreatment;
	}
	
	public UsersBean getUser() {
		return user;
	}


	public void setUser(UsersBean user) {
		this.user = user;
	}

	public UsersServices getUsSrv() {
		return usSrv;
	}

	public TreatmentServices getTrSrv() {
		return trSrv;
	}

	public Collection<TreatmentBean> getAllTreatment() {
		return allTreatment;
	}

	public void setUsSrv(UsersServices usSrv) {
		this.usSrv = usSrv;
	}

	public void setTrSrv(TreatmentServices trSrv) {
		this.trSrv = trSrv;
	}

	public void setAllTreatment(Collection<TreatmentBean> allTreatment) {
		this.allTreatment = allTreatment;
	}
	

}
